package A一周刷爆LeetCode.A基础班.C认识NlogN的排序;

import A一周刷爆LeetCode.A基础班.B认识复杂度和简单排序算法.Sort;

import java.util.Objects;

/**
 * @author wei.zhao
 * @description: 快排1.0版本
 * @date 2022年01月14日 10:51
 */
public class Code06_QuickSort01 extends Sort {

    @Override
    public void sort(int[] arr) {
        if (Objects.isNull(arr) || arr.length < 2) {
            return;
        }
        quickSort(arr, 0, arr.length - 1);
    }

    private void quickSort(int[] arr, int l, int r) {
        if (l == r) {
            return;
        }
        //返回当前确定的位置
        int cp = partition(arr, l, r);
        if (cp > l) {
            //快排左边
            quickSort(arr, l, cp - 1);
        }
        if (cp < r) {
            //快排右边
            quickSort(arr, cp + 1, r);
        }
    }

    private int partition(int[] arr, int l, int r) {
        int temp = arr[r];
        int lp = l;
        int rp = r;
        for (int i = l; i <= r; i++) {
            if (i > rp) {
                break;
            }
            if (arr[i] < temp) {
                swap(arr, i, lp++);
            } else if (arr[i] > temp) {
                swap(arr, i--, rp--);
            }
        }
        return lp;
    }

}
